Открытый программный интерфейс (Open API v2.0)
Система спутникового мониторинга транспорта SKIF.PRO имеет открытое API для интеграции телематических данных и аналитики в любые сторонние корпоративные системы: 1С:Предприятие (УАТ, ERP), TMS/WMS логистические платформы, BI-системы и мобильные приложения.
Интерактивное описание API и документация доступны по адресу: https://api.skif.pro (Swagger UI: https://api.skif.pro/docs).
Для выполнения интеграционных запросов и работы фоновых служб рекомендуется явно использовать выделенный рабочий сервер: https://app1.skif.pro/api_v1.
Быстрые ссылки для разработчиков
| Ресурс | Описание | Ссылка |
|---|---|---|
| Портал API | Официальный портал открытого программного интерфейса | api.skif.pro |
| Swagger UI | Интерактивная веб-песочница с описанием методов и возможностью тестирования | api.skif.pro/docs |
| Рабочий сервер API | Рекомендуемый выделенный/резервный контур для интеграций и фоновых задач | https://app1.skif.pro/api_v1 |
| Postman-коллекция | Готовая коллекция эндпоинтов со схемой переменных и примерами запросов | Скачать коллекцию Postman v2.1 |
| OpenAPI 3.0 JSON | Машиночитаемая спецификация для генерации клиентских библиотек (SDK) | api.skif.pro/openapi.json |
Быстрый старт: первые данные за 3 шага
Для отправки запросов используется базовый адрес: https://app1.skif.pro/api_v1.
Шаг 1. Авторизация и получение токена
Аутентификация в API выполняется запросом POST /api_v1/login:
curl -i -X POST "https://app1.skif.pro/api_v1/login" \ -H "Content-Type: application/json" \ -d '{ "userProviderId": "your_login@company.ru", "provider_key": "EMAIL", "password": "your_password" }'
Важно: При успешной авторизации (
HTTP 200) тело ответа пустое, а токен авторизации возвращается в HTTP-заголовке ответа:
Authorization: Bearer eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9...
Шаг 2. Первый запрос: Список объектов компании
Для всех последующих запросов передавайте полученный токен в заголовке Authorization: Bearer <токен>. Использование сессионных cookies не требуется — API работает автономно по Bearer-токену.
curl -X POST "https://app1.skif.pro/api_v1/units/list" \ -H "Authorization: Bearer eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9..." \ -H "Content-Type: application/json" \ -d '{ "from": 0, "count": 10 }'
Пример ответа сервера:
{ "max": 42, "list": [ { "id": "3efbec79-a0b2-41aa-a859-cacd80323d2f", "name": "Газель Next А102ВВ", "device_type": "Navtelecom SMART S-2420", "imei": "866795031900671" } ] }
Шаг 3. Запрос телеметрии и текущего состояния ТС
Получение актуальных параметров объекта (координаты, скорость, зажигание, датчики уровня топлива):
curl -X GET "https://app1.skif.pro/api_v1/units?ids=3efbec79-a0b2-41aa-a859-cacd80323d2f" \ -H "Authorization: Bearer <токен>"
Постоянный API-ключ компании (Static API Key)
Если вашей интеграции (например, серверу 1С или регулярному фоновому скрипту) неудобно регулярно вызывать логин и хранить динамические JWT-токены, администратор компании может выпустить постоянный токен доступа.
Создание постоянного ключа (выполняет администратор через API или веб-кабинет):
POST https://app1.skif.pro/api_v1/users/:user_id/create_token { "valid_to": "2028-12-31 23:59:59" }
В ответе возвращается ключ:
{"user_company_api_key": "YOUR_COMPANY_API_KEY"}.Использование ключа:
Передавайте данный ключ в любом запросе в заголовкеuser_company_api_key:curl -X POST "https://app1.skif.pro/api_v1/units/list" \ -H "user_company_api_key: YOUR_COMPANY_API_KEY" \ -H "Content-Type: application/json" \ -d '{"from": 0, "count": 10}'
Основные функциональные модули API
| Модуль | Ключевые методы | Возможности и типовые задачи |
|---|---|---|
| Объекты и датчики | POST /units/listGET /units?ids=...GET /unit_sensors/:id |
Реестр транспортных средств компании, установленные терминалы, счетчики пробега/моточасов, тарировочные таблицы баков. |
| Пользователи и водители | POST /users/queryPOST /usersPOST /drivers/import_csvPOST /users/import_csvPATCH /users/roles/bulk |
Справочник пользователей и водителей компании: фильтр по признаку водителя и ролям, быстрое создание водителя по ФИО, пакетный импорт водителей и пользователей из CSV, массовая смена роли. Водители используются для автоназначения на объекты по коду (RFID). |
| Телеметрия и треки | POST /fasttracksPOST /fasttracks/bulkGET /box_tracks |
Получение детализированных треков за интервал дат, сглаживание выбросов GPS, чтение сырых пакетов телеметрии. |
| Поездки и стоянки | POST /report (Шаблон «Поездки»)POST /chronology_report |
Детектор движения: расчет поездок, пробега, остановок и стоянок с определением адресов стоянок. |
| Контроль топлива | POST /report (Шаблон «Топливо»)GET /units/fuel_level |
Расход топлива по ДУТ и CAN-шине, детекция сливов и заправок с точным объемом в литрах. |
| Геозоны и маршруты | GET /geozonesPOST /geozonesPOST /races/list |
Контроль входа/выхода из полигонов и окружностей, плановые маршруты и контроль соблюдения графика. |
| События и тревоги | POST /events/listPOST /notifications |
Тревоги по превышению скорости, кнопке SOS, эвакуации, отключению питания трекера. Доставка через Webhooks / Telegram. |
| Аналитические отчеты | POST /reportPOST /report_excel |
Сводные ведомости по парку за период, экспорт готовых отчетов в Excel (.xlsx) и PDF. |
| Интеграция с 1С | POST /units/listPOST /report |
Заполнение путевых листов 1С фактическим пробегом, расходом ГСМ и отработанными моточасами. |
Стандарты взаимодействия, ограничения и производительность
Выбор сервера
- Рабочий контур для интеграций (рекомендуется):
https://app1.skif.pro/api_v1.
Использование сервераapp1.skif.proобеспечивает прямое и стабильное обслуживание API-интеграций и фоновых задач без конкуренции за пул сетевых соединений основного клиентского интерфейса. - Интерактивная документация:
https://api.skif.pro(Swagger:https://api.skif.pro/docs). - Тестовый контур:
https://release.skif.pro/api_v1.
Лимиты частоты запросов (Rate Limits)
В сервисе авторизации платформы (skif_auth) действует автоматическая защита от перегрузки:
- Базовый лимит: 40 запросов в минуту на учетную запись (по скользящему окну 60 секунд на каждый шаблон маршрута).
- Лимит на метод
/login: до 40 запросов в минуту с одного IP-адреса. - Код ответа при превышении лимита: сервер возвращает
HTTP 429 Too Many Requestsсо структурой:{ "code": 4029, "field": "", "message": "Превышено количество отправленных запросов в минуту, подождите немного." }
Рекомендации по паузам между запросами (Throttling)
- Интервал 300–600 мс: После выполнения каждого запроса в цикле рекомендуется выдерживать паузу 300–600 мс перед отправкой следующего вызова (особенно для ресурсоемких операций: выгрузка треков
POST /fasttracks, расчет отчетовPOST /report, построение хронологииPOST /chronology_reportили опрос расширенных данных по ТС). Это предотвращает случайное исчерпание лимита в 40 запросов в минуту и исключает взаимные блокировки при параллельной обработке. - Пакетная обработка (
bulk): Вместо последовательного опроса каждого транспортного средства по отдельности используйте пакетные методы (например,POST /fasttracksподдерживает массив идентификаторовunits: [{"id": "..."}, ...]). - Обработка ошибки 429: При получении ответа
429скрипт интеграции должен сделать экспоненциальную паузу (backoff) на 2–5 секунд перед повтором запроса.
Примеры кода
Python: Получение списка ТС с обработкой пауз
import time import requests # Рекомендуемый сервер для API интеграций BASE_URL = "https://app1.skif.pro/api_v1" # 1. Авторизация auth_resp = requests.post( f"{BASE_URL}/login", json={ "userProviderId": "your_login@company.ru", "provider_key": "EMAIL", "password": "your_password" }, headers={"Content-Type": "application/json"} ) auth_resp.raise_for_status() # 2. Извлечение токена из заголовка ответа token = auth_resp.headers.get("Authorization") headers = { "Authorization": token, "Content-Type": "application/json", "Accept": "application/json" } # 3. Запрос списка транспортных средств resp = requests.post( f"{BASE_URL}/units/list", headers=headers, json={"from": 0, "count": 20} ) resp.raise_for_status() data = resp.json() print(f"Всего объектов в парке: {data.get('max')}") for unit in data.get("list", []): unit_id = unit["id"] unit_name = unit["name"] print(f"• ТС: {unit_name} (ID: {unit_id})") # Пауза 400-500 мс перед следующим тяжелым запросом телеметрии time.sleep(0.5) telemetry_resp = requests.get( f"{BASE_URL}/units?ids={unit_id}", headers=headers ) if telemetry_resp.status_code == 200: telemetry = telemetry_resp.json() print(" Данные получены успешно.") elif telemetry_resp.status_code == 429: print(" Внимание: сработал лимит частоты, пауза 3 сек...") time.sleep(3)
Node.js / JavaScript (Fetch API с паузой)
// Рекомендуемый сервер для API интеграций const BASE_URL = 'https://app1.skif.pro/api_v1'; // Функция задержки между вызовами (300-600 мс) const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); async function runIntegration() { // 1. Авторизация const loginRes = await fetch(`${BASE_URL}/login`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ userProviderId: 'your_login@company.ru', provider_key: 'EMAIL', password: 'your_password' }) }); if (!loginRes.ok) throw new Error(`Login failed with status: ${loginRes.status}`); // Токен передается в HTTP-заголовке Authorization const token = loginRes.headers.get('authorization'); // 2. Получение списка ТС const listRes = await fetch(`${BASE_URL}/units/list`, { method: 'POST', headers: { 'Authorization': token, 'Content-Type': 'application/json' }, body: JSON.stringify({ from: 0, count: 10 }) }); const listData = await listRes.json(); console.log(`Всего объектов: ${listData.max}`); for (const unit of listData.list) { console.log(`Объект: ${unit.name} (ID: ${unit.id})`); // Пауза 500 мс перед следующим запросом await sleep(500); const unitRes = await fetch(`${BASE_URL}/units?ids=${unit.id}`, { headers: { 'Authorization': token } }); if (unitRes.status === 429) { console.warn('Превышен лимит запросов, пауза 3 сек...'); await sleep(3000); } } } runIntegration().catch(console.error);
Безопасность и лучшие практики
- Защита учетных данных: Не храните логин и пароль в открытом виде в исходном коде. Используйте переменные окружения или постоянный ключ
user_company_api_key. - Кэширование токена: Полученный JWT-токен действителен длительное время. Не вызывайте метод
/loginперед каждым отдельным запросом — сохраняйте полученный токен и обновляйте его только при ответе сервера401 Unauthorized. - Учет лимитов и таймаутов: При интеграции с 1С настраивайте таймаут ожидания HTTP-соединения не менее 30–60 секунд для тяжелых аналитических отчетов и используйте интервалы 300–600 мс между последовательными запросами.
Техническая поддержка интеграторов и обратная связь
Если вы обнаружили ошибку в работе методов, расхождение с документацией или у вас возник технический вопрос по интеграции:
- Форма обратной связи на портале API: Нажмите кнопку «Сообщить об ошибке» в шапке документации https://api.skif.pro. Заполните контур проблемы (боевой
app1.skif.proили стенд документацииapi.skif.pro), метод и ваш API-ключ компании. Обращение сразу поступит в очередь разработки. - Email техподдержки: support@skif.pro (обязательно укажите тему вида
[API Issue] {Метод} - {Компания}, вашcompany_idи cURL вызова). - Персональный менеджер: Обратитесь к вашему персональному менеджеру SKIF.PRO для согласования индивидуальных лимитов или выделенных вычислительных очередей.